﻿using System;
using System.Collections;
using System.Collections.Generic;

namespace InDepth2Demo.Chapter3
{
    public class IteratorDemo_4
    {
        public static void Call()
        {
            // IEnumerator<int> 可以隐式转换为 IEnumerator
            IEnumerator<int> x = CreateSimpleIterator().GetEnumerator();
            IEnumerator enumerator = x;
            Console.WriteLine(enumerator);

            //证明 可枚举类型 能正常工作
            CountingEnumerable countingEnumerable = new CountingEnumerable();
            foreach (int i in countingEnumerable)
            {
                Console.WriteLine(i);
            }

        }

        static IEnumerable<int> CreateSimpleIterator()
        {
            yield return 10;
            for (int i = 0; i < 3; i++)
            {
                yield return i;
            }
            yield return 20;
        }
    }

    /// <summary>
    /// 当需要为自己的某个类型实现迭代时，你会发现由于 IEnumerable<T> 扩展了旧的 IEnumerable 接口，所以需要实现两个不同的方法。
    /// IEnumerator<T> GetEnumerator();
    /// IEnumerator GetEnumerator();
    /// </summary>
    class CountingEnumerable : IEnumerable<int>
    {
        public IEnumerator<int> GetEnumerator()     // 隐式实现 IEnumerator<int>
        {
            return new CountingEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()     // 显式实现 IEnumerable
        {
            return GetEnumerator();
        }
    }

    class CountingEnumerator : IEnumerator<int>
    {
        int current = -1;

        public bool MoveNext()
        {
            current++;
            return current < 10;
        }

        public int Current { get { return current; } }      // 隐式实现 IEnumerator<int>.Current

        object IEnumerator.Current { get { return current; } }      // 显式实现 IEnumerator.Current

        public void Reset()
        {
            current = -1;
        }

        public void Dispose() { }
    }


}
